/**
 * @file: Jugador.h.
 * @author: Edwin Marcelo Guzman Buezo.
 * @date: MAY-18-2009.
 * @desc: Este archivo contiene la clase Jugador.
 */
 
#ifndef _Jugador_h_
#define _Jugador_h_
 
#include<iostream>
#include<vector>
#include "Carta.h"
#include "Constantes.h"
#include "Mano.h"
using namespace std;

/**
 * La clase Jugador tiene metodos para que los jugadores puedan realizar sus jugadas.
 */

class Jugador{
    public:

        /**
         * Esta funcion se la cargara en las clases derivadas pero se la tiene.
         * que declarar en esta clase.
         */
        virtual TipoJugador getTipo(){}
        
        /**
         * Contructor de la Clase con valores de entrada.
         * @param[in] nombre del jugador.
         */
        Jugador(string nombre);
        
        /**
         * Contructor de la Clase sin valores de entrada.
         */
        Jugador();
        
        /**
         * Sirve para pasar el turno a cada uno de los jugadores
         * el jugador que ejecuta esto significa que es su turno
         * y podra realizar su jugada.
         * @param[out] apuesta actual de la mesa.
         * @param[in] Ronda tiene las cartas de la mesa.
         * @return que jugada se realizo 0=RETIRARSE, 1=PASAR, 2=APOSTAR, 3=ALLIN, 4=ERROR.
         */
        JUGADA jugar();

        /**
         * este metodo no hace nada el jugador no apuesta y no se retira.
         */
        bool pasar(int apuestaActual,int apuestaDeEsteJugador);
        
        /**
         * hace que el jugador salga de la ronda.
         */
        void retirarse();
        
        /**
         * Realiza una apuesta en la ronda.
         * @param[in] int apuesta que realiza el jugador.
         */
        int apostar(int& apuestaActual,int& apuestaDeEsteJugador,int apuesta);
        
        /**
         * debuelve el valor de las fichas que tiene el jugador.
         * @return valor entero que representa fichas que tiene el jugador.
         */
        int getFichas();
        
        /**
         * Cambia el valor que tienen las fichas.
         * @param[in] newFichas nueva cantidad de fichas que se le daran al jugador.
         */
        void setFichas(int newFichas);
        
        /**
         * Aumenta fichas a las fichas del jugador.
         * @param[in] fichas cantidad de fichas que se aumentaran al jugador.
         */
        void darFichas(int fichas);
        
        /**
         * Quitar fichas al Jugador.
         * @param[in] fichas cantidad de fichas que se restaran al jugador.
         */
        void quitarFichas(int fichas);
        
        /**
         * Debuelve la mano que le toco al jugador.
         * @return mano del jugador del tipo Mano.
         */
        Mano getMano();
        
        /**
         * Da una nueva mano al jugador.
         * @param[in] newMano nueva mano del jugador.
         */
        void setMano(Mano newMano);
        
        /**
         * debuelve el nombre del jugador.
         * @return nombre del tipo string.
         */
        string getNombre();
        //el modulo jugador ya funciona sin errores
        /**
         * Le pone un nombre al jugador.
         * @param[in] newNombre es el nuevo nombre que se dio al jugador.
         */
        void setNombre(string newNombre);
        
    private:
        
        /**
         * fichas representa la cantidad de puntos que tiene el jugador.
         */
        int _fichas;
        
        /**
         * mano es la propiedad que siver para saber que cartas le tocaron en
         * esta ronda al jugador.
         */
        Mano _mano;
        
        /**
         * nombre es la propiedad que ayuda a identificar a cada jugador.
         */
        string _nombre;

};
#endif //_Jugador_h_

